#include <iostream>

// 函数重载：不同的函数功能可以用相同的函数名
// func(int a) ——> func         函数名（C语言）
// func(int a) ——> _int_func    函数名（C++）
// func(char a) ——> _char_func
// func(int a, int a) ——> _int_int_func

// 构成重载的规则：
//  1、参数数量不一样
//  2、参数类型不一样
//  3、参数顺序不一样
// 返回值不同能不能构成重载？   
// 不能！无法重载仅按返回值类型区分的函数，因为返回值没有被当作名字的一部分被放进去

#if 0
    void func(int a)
    {
        std::cout<<"func int"<<std::endl;
    }

    void func(short a)
    {
        std::cout<<"func short"<<std::endl;
    }

    int main()
    {

        int a;
        func(a);    // 调的是int类型的func

        // short a; // 调的是short类型的func
        // func(a);

        return 0;
    }
#endif

#if 0
    void func(int a)
    {
        std::cout<<"func int"<<std::endl;
    }

    void func(int* a)
    {
        std::cout<<"func int*"<<std::endl;
    }

    int main()
    {
        // 重载会带来的问题
        // 在C语言里，NULL实际上就是值0，只不过被强转成void*，就把它当作一个空指针去描述
        // 在C++里，既然支持重载，所以它既能被当成是int，又能被当成是int*指针，这就产生了歧义
        // 于是C++里引入了nullptr，代表空指针
        // nullptr是嵌在编译器里的关键字————空指针

        // func(NULL);
        func(nullptr);

        return 0;
    }
#endif

#if 1
    // define是没有数据类型的，连它调的是哪个都不知道，所以它在重载函数里的表现并不算优异
    // 不定义类型，整数就默认是int类型
    // #define Max 1024
    
    // C++里const是一个真常量，所以可以正常的去使用它
    // 在C++里定义常量的时候，建议用const替代define
    // 理由：define定义的常量没有明确的数据类型，没有const定义的那么直观
    const short Max = 1024;
    void func(int a)
    {
        std::cout<<"func int"<<std::endl;
    }

    void func(short a)
    {
        std::cout<<"func short"<<std::endl;
    }

    int main()
    {
        func(Max);

        return 0;
    }
#endif